/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Com.Entity;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.util.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

/**
 *
 * @author Ignacio
 */
public class TransaksiKamar {

    /**
     * letakkan semua fungsi untuk menambah data kamar dikelas ini
     * ciri-cirinya terlihat dari penggunaan obyek koneksi di kelas ini
     */
    //test komit
    private int nomor_kamar;
    private String nama_tamu;
    private String jenis_Id;
    private String no_id;
    private String jenis_kelamin;
    private String tipe_kamar;
    private String tempat_lahir;
    private String no_telepon;
    private int jum_penyewa;
    static String kodeAwal = "MIAAK";
    private String no_checkin;
    private long totalHargaSewa;
    private String tanggalMasuk;
    private String tanggalKeluar;
    private String tanggalBooking;
    private String alamatTamu;
    private String jenisKamar;
    private String tanggalLahir;
    private Connection konek = null;
    private static TransaksiKamar koneksi;

    public TransaksiKamar() {
    }

    public TransaksiKamar(Connection konek) {
        this.konek = konek;
    }

    public static TransaksiKamar getKoneksiKontrol()
            throws SQLException, FileNotFoundException, IOException {
        if (koneksi == null) {
            koneksi = new TransaksiKamar(Koneksi.getDBConnection());
        }
        return koneksi;
    }

    public List<TransaksiKamar> getDailyReportKamar(Date tanggal) throws SQLException {
        List<TransaksiKamar> transaksiKamar = new ArrayList<TransaksiKamar>();
        try {
            Connection conn = Koneksi.getDBConnection();
            PreparedStatement psmt = null;
            ResultSet rset = null;
            konek.setAutoCommit(false);
            String sql = "select notransaksikamar,nokamar,"
                    + "to_char(tanggalmasuk,'dd-MM-yyyy'),to_char(tanggalkeluar,'dd-MM-yyyy'),"
                    + "totaltagihan from transaksikamar where to_char(tanggalkeluar,'dd-MM-yyyy')=(?)";
            psmt = konek.prepareStatement(sql);
            String hari = null;
            if (tanggal.getDate() < 10) {
                hari = "0" + tanggal.getDate();
            } else {
                hari = String.valueOf(tanggal.getDate());
            }
            String bulan = null;
            if ((tanggal.getMonth() + 1) < 10) {
                bulan = "0" + (tanggal.getMonth() + 1);
            } else {
                bulan = String.valueOf((tanggal.getMonth() + 1));
            }
            String date = hari + "-" + bulan + "-" + ((Integer) tanggal.getYear() + 1900);
            psmt.setString(1, date);
            rset = psmt.executeQuery();
            while (rset.next()) {
                TransaksiKamar transKamar = new TransaksiKamar();
                transKamar.setNo_checkin(rset.getString(1));
                transKamar.setNomor_kamar(rset.getInt(2));
                try {
                    transKamar.setTanggalMasuk(rset.getString(3));
                    transKamar.setTanggalKeluar(rset.getString(4));
                } catch (Exception ex) {
                    return transaksiKamar;
                }
                transKamar.setTotalHargaSewa(rset.getLong(5));
                transaksiKamar.add(transKamar);
            }
            return transaksiKamar;
        } catch (FileNotFoundException ex) {
            return transaksiKamar;
        } catch (IOException ex) {
            return transaksiKamar;
        }
    }

    public String callNoTransaksi() throws SQLException {
        CallableStatement clstate = null;
        String sql = "{CALL notranskamar(?,?)}";
        clstate = konek.prepareCall(sql);
        clstate.setString(1, kodeAwal);
        clstate.registerOutParameter(2, java.sql.Types.VARCHAR);
        clstate.execute();
        String nomor = clstate.getString(2);
        clstate.close();
        return nomor;

    }

    /**
     * @return the nomor_kamar
     */
    public int getNomor_kamar() {
        return nomor_kamar;
    }

    /**
     * @param nomor_kamar the nomor_kamar to set
     */
    public void setNomor_kamar(int nomor_kamar) {
        this.nomor_kamar = nomor_kamar;
    }

    /**
     * @return the nama_tamu
     */
    public String getNama_tamu() {
        return nama_tamu;
    }

    /**
     * @param nama_tamu the nama_tamu to set
     */
    public void setNama_tamu(String nama_tamu) throws Exception {
        if (nama_tamu == null || nama_tamu.matches("")) {
            throw new Exception("Nama masih kosong");
        } else if (nama_tamu.length() > 20) {
            throw new Exception("Nama tamu salah, masukan lebih dari 20");
        } else if (nama_tamu.matches("[a-zA-Z ]*")) {
            this.nama_tamu = nama_tamu;
        } else {
            throw new Exception("nama tamu salah karena terdapat angka atau symbol");
        }
    }

    /**
     * @return the no_id
     */
    public String getNo_id() {
        return no_id;
    }

    /**
     * @param no_id the no_id to set
     */
    public void setNo_id(String no_id) throws Exception {
        if (no_id == null || no_id.matches("")) {
            throw new Exception("No Id masih kosong atau belum diisi");
        } else if (no_id.length() > 20) {
            throw new Exception("No ID salah, masukan lebih dari 20");
        } else if (no_id.matches("[a-zA-Z0-9]*")) {
            this.no_id = no_id;
        } else {
            throw new Exception("No ID salah karena terdapat symbol atau spasi");
        }
    }

    /**
     * @return the jenis_kelamin
     */
    public String getJenis_kelamin() {
        return jenis_kelamin;
    }

    /**
     * @param jenis_kelamin the jenis_kelamin to set
     */
    public void setJenis_kelamin(String jenis_kelamin) throws Exception {
        this.jenis_kelamin = jenis_kelamin;
    }

    /**
     * @return the tipe_kamar
     */
    public String getTipe_kamar() {
        return tipe_kamar;
    }

    /**
     * @param tipe_kamar the tipe_kamar to set
     */
    public void setTipe_kamar(String tipe_kamar) throws Exception {
        this.tipe_kamar = tipe_kamar;
    }

    /**
     * @return the tempat_lahir
     */
    public String getTempat_lahir() {
        return tempat_lahir;
    }

    /**
     * @param tempat_lahir the tempat_lahir to set
     */
    public void setTempat_lahir(String tempat_lahir) throws Exception {
        if (tempat_lahir == null || tempat_lahir.matches("")) {
            throw new Exception("Tempat lahir tamu masih kosong belum diisi");
        } else if (tempat_lahir.toCharArray().length > 20) {
            throw new Exception("Tempat lahir tamu salah, masukan lebih dari 15");
        } else if (!tempat_lahir.matches("[a-zA-Z ]*")) {
            throw new Exception("tempat lahir salah karena terdapat angka atau symbol");
        } else {
            this.tempat_lahir = tempat_lahir;
        }
    }

    /**
     * @return the no_telepon
     */
    public String getNo_telepon() {
        return no_telepon;
    }

    /**
     * @param no_telepon the no_telepon to set
     */
    public void setNo_telepon(String no_telepon) throws Exception {
        if (no_telepon == null || no_telepon.matches("")) {
            throw new Exception("nomor telp belum diisi atau masih kosong");
        } else if (no_telepon.startsWith("+") && no_telepon.length() <= 15) {
            if (!no_telepon.substring(1).matches("[0-9]*")) {
                throw new Exception("nomor telp hanya berisi angka dan dapat diawali tanda +");
            } else {
                this.no_telepon = no_telepon;
            }
        } else if (no_telepon.matches("[0-9]*") && no_telepon.length() <= 15) {
            this.no_telepon = no_telepon;
        } else if (no_telepon.length() > 15) {
            throw new Exception("nomor telp lebih dari 15 digit");
        } else {
            throw new Exception("nomor telp hanya berisi angka dan dapat diawali tanda +");
        }
    }

    /**
     * @return the jum_penyewa
     */
    public int getJum_penyewa() {
        return jum_penyewa;
    }

    /**
     * @param jum_penyewa the jum_penyewa to set
     */
    public void setJum_penyewa(int jum_penyewa) throws Exception {
        try {
            this.jum_penyewa = jum_penyewa;
        } catch (NumberFormatException ex) {
            JOptionPane.showMessageDialog(null, "jumlah penyewa tidak boleh huruf, ulangi kembali");
        }
    }

    /**
     * @return the jum_kamarsewa
     */
    /**
     * @return the no_checkin
     */
    public String getNo_checkin() {
        return no_checkin;
    }

    /**
     * @param no_checkin the no_checkin to set
     */
    public void setNo_checkin(String no_checkin) {
        this.no_checkin = no_checkin;
    }

    /**
     * @return the totalHargaSewa
     */
    public long getTotalHargaSewa() {
        return totalHargaSewa;
    }

    /**
     * @param totalHargaSewa the totalHargaSewa to set
     */
    public void setTotalHargaSewa(long totalHargaSewa) {
        try {
            this.totalHargaSewa = totalHargaSewa;
        } catch (NumberFormatException ex) {
            JOptionPane.showMessageDialog(null, "Harga tidak boleh huruf, ulangi kembali");
        }
    }

    /**
     * @return the jenis_Id
     */
    public String getJenis_Id() {
        return jenis_Id;
    }

    /**
     * @param jenis_Id the jenis_Id to set
     */
    public void setJenis_Id(String jenis_Id) throws Exception {
        this.jenis_Id = jenis_Id;
    }

    /**
     * @return the tanggalMasuk
     */
    public String getTanggalMasuk() {
        return tanggalMasuk;
    }

    /**
     * @param tanggalMasuk the tanggalMasuk to set
     */
    public void setTanggalMasuk(String tanggalMasuk) throws Exception {
        if (tanggalMasuk == null || tanggalMasuk.matches("")) {
            throw new Exception("Tanggal masuk masih kosong atau belum diisi");
        } else if (tanggalMasuk.length() > 10) {
            throw new Exception("Tanggal masuk terlalu panjang");
        } else if (!tanggalMasuk.matches("[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]")) {
            throw new Exception("Format lahir salah, format tanggal = dd-MM-yyyy");
        } else if (tanggalMasuk.substring(0, 2).matches("[0][0]")) {
            throw new Exception("Hari tidak mungkin 00");
        } else if (tanggalMasuk.substring(3, 5).matches("[0][0]")) {
            throw new Exception("Bulan tidak mungkin 00");
        } else {
            this.tanggalMasuk = tanggalMasuk;
        }
    }

    /**
     * @return the tanggalKeluar
     */
    public String getTanggalKeluar() {
        return tanggalKeluar;
    }

    /**
     * @param tanggalKeluar the tanggalKeluar to set
     */
    public void setTanggalKeluar(String tanggalKeluar) throws Exception {
        if (tanggalKeluar == null || tanggalKeluar.matches("")) {
            throw new Exception("Tanggal keluar masih kosong atau belum diisi");
        } else if (tanggalKeluar.length() > 10) {
            throw new Exception("Tanggal keluar terlalu panjang");
        } else if (!tanggalKeluar.matches("[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]")) {
            throw new Exception("Format keluar salah, format tanggal = dd-MM-yyyy");
        } else if (tanggalKeluar.substring(0, 2).matches("[0][0]")) {
            throw new Exception("Hari keluar mungkin 00");
        } else if (tanggalKeluar.substring(3, 5).matches("[0][0]")) {
            throw new Exception("Bulan keluar mungkin 00");
        } else {
            this.tanggalKeluar = tanggalKeluar;
        }
    }

    /**
     * @return the tanggalBooking
     */
    public String getTanggalBooking() {
        return tanggalBooking;
    }

    /**
     * @param tanggalBooking the tanggalBooking to set
     */
    public void setTanggalBooking(String tanggalBooking) throws Exception {
        if (tanggalBooking == null || tanggalBooking.matches("")) {
            throw new Exception("Tanggal booking masih kosong atau belum diisi");
        } else if (tanggalBooking.length() > 10) {
            throw new Exception("Tanggal booking terlalu panjang");
        } else if (!tanggalBooking.matches("[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]")) {
            throw new Exception("Format booking salah, format tanggal = dd-MM-yyyy");
        } else if (tanggalBooking.substring(0, 2).matches("[0][0]")) {
            throw new Exception("Hari tidak mungkin 00");
        } else if (tanggalBooking.substring(3, 5).matches("[0][0]")) {
            throw new Exception("Bulan tidak mungkin 00");
        } else {
            this.tanggalBooking = tanggalBooking;
        }
    }

    public void CheckIn(TransaksiKamar kamar) throws SQLException {
        CallableStatement callst = null;
        String sql = "{CALL updatetranskamar(?,?,?,?,?,?,?,?,?,?,?)}";
        callst = konek.prepareCall(sql);
        callst.setObject(1, kamar.getNo_checkin());
        callst.setObject(2, Karyawan.getusrID().getUsername());
        callst.setObject(3, kamar.getNomor_kamar());
        callst.setObject(4, kamar.getNama_tamu());
        callst.setObject(5, kamar.getNo_id());
        callst.setObject(6, kamar.getJenis_Id());
        callst.setObject(7, kamar.getTanggalLahir());
        callst.setObject(8, kamar.getNo_telepon());
        callst.setObject(9, kamar.getAlamatTamu());
        callst.setObject(10, kamar.getJum_penyewa());
        callst.setObject(11, kamar.getTanggalMasuk());

        callst.executeUpdate();
        callst.close();
        konek.commit();
    }

    /**
     * @return the alamatTamu
     */
    public String getAlamatTamu() {
        return alamatTamu;
    }

    /**
     * @param alamatTamu the alamatTamu to set
     */
    public void setAlamatTamu(String alamatTamu) throws Exception {
        if (alamatTamu == null || alamatTamu.matches("")) {
            throw new Exception("alamat belum diisi atau masih kosong");
        } else if (!alamatTamu.matches("[0-9a-zA-Z. ]*")) {
            throw new Exception("terdapat simbol pada alamat");
        } else if (alamatTamu.length() > 200) {
            throw new Exception("alamat terlalu panjang, maksimal 200 huruf");
        } else {
            this.alamatTamu = alamatTamu;
        }
    }

    /**
     * @return the jenisKamar
     */
    public String getJenisKamar() {
        return jenisKamar;
    }

    /**
     * @param jenisKamar the jenisKamar to set
     */
    public void setJenisKamar(String jenisKamar) {
        this.jenisKamar = jenisKamar;
    }

    /**
     * @return the tanggalLahir
     */
    public String getTanggalLahir() {
        return tanggalLahir;
    }

    /**
     * @param tanggalLahir the tanggalLahir to set
     */
    public void setTanggalLahir(String tanggalLahir) throws Exception {
        if (tanggalLahir == null || tanggalLahir.matches("")) {
            throw new Exception("Tanggal lahir masih kosong atau belum diisi");
        } else if (tanggalLahir.length() > 10) {
            throw new Exception("Tanggal lahir terlalu panjang");
        } else if (!tanggalLahir.matches("[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]")) {
            throw new Exception("Format lahir salah, format tanggal = dd-MM-yyyy");
        } else if (tanggalLahir.substring(0, 2).matches("[0][0]")) {
            throw new Exception("Hari tidak mungkin 00");
        } else if (tanggalLahir.substring(3, 5).matches("[0][0]")) {
            throw new Exception("Bulan tidak mungkin 00");
        } else {
            this.tanggalLahir = tanggalLahir;
        }
    }

    public TransaksiKamar cariKamar(TransaksiKamar transKamar) throws SQLException, Exception {
        CallableStatement callst = null;
        String sql = "{CALL carikamar(?,?,?,?,?,?,?)}";
        callst = konek.prepareCall(sql);
        callst.setInt(1, transKamar.getNomor_kamar());
        callst.registerOutParameter(2, java.sql.Types.VARCHAR);
        callst.registerOutParameter(3, java.sql.Types.VARCHAR);
        callst.registerOutParameter(4, java.sql.Types.VARCHAR);
        callst.registerOutParameter(5, java.sql.Types.INTEGER);
        callst.registerOutParameter(6, java.sql.Types.VARCHAR);
        callst.registerOutParameter(7, java.sql.Types.VARCHAR);

        callst.execute();
        String namatamu = callst.getString(2);
        String alamattamu = callst.getString(3);
        String tanggalmasuk = callst.getString(4);
        int jumpenyewa = callst.getInt(5);
        String tipekmr = callst.getString(6);
        String notrans = callst.getString(7);

        callst.execute();
        callst.close();
        transKamar.setNama_tamu(namatamu);
        transKamar.setAlamatTamu(alamattamu);
        transKamar.setTanggalMasuk(tanggalmasuk);
        transKamar.setJum_penyewa(jumpenyewa);
        transKamar.setTipe_kamar(tipekmr);
        transKamar.setNo_checkin(notrans);
        return transKamar;
    }

    public int checkOut(int nokamar, String waktu) throws SQLException {
        CallableStatement call = null;
        String sql = "{CALL checkOut(?,?,?)}";
        call = konek.prepareCall(sql);
        call.setObject(1, nokamar);
        call.setString(2, waktu);
        call.registerOutParameter(3, java.sql.Types.INTEGER);
        call.execute();
        int harga = call.getInt(3);
        call.close();
        konek.commit();
        return harga;

    }

    public void batalTrans(String notrans) throws SQLException {
        PreparedStatement stat = null;
        String sql = "delete from transaksikamar where notransaksikamar=(?)";
        stat = konek.prepareStatement(sql);
        stat.setString(1, notrans);
        stat.execute();
        stat.close();
        konek.commit();

    }
}
